package deferpkg

import (
	"fmt"
	"os"
)

// DemoDeferOrder 演示defer的执行顺序
func DemoDeferOrder() {
	fmt.Println("=== Defer高级用法演示 ===")
	fmt.Println("\n--- defer执行顺序 ---")

	fmt.Println("函数开始执行")

	defer fmt.Println("defer 1")
	defer fmt.Println("defer 2")
	defer fmt.Println("defer 3")

	fmt.Println("函数执行中")
	// defer是后进先出(LIFO)的顺序执行
}

// DemoDeferWithAnonymousFunction 演示defer与匿名函数
func DemoDeferWithAnonymousFunction() {
	fmt.Println("\n--- defer与匿名函数 ---")

	count := 0

	defer func() {
		fmt.Printf("defer匿名函数1: count = %d\n", count)
	}()

	defer func(c int) {
		fmt.Printf("defer匿名函数2: c = %d\n", c)
	}(count)

	count++
	fmt.Printf("函数内: count = %d\n", count)
}

// DemoDeferWithErrorHandling 演示defer在错误处理中的应用
func DemoDeferWithErrorHandling() {
	fmt.Println("\n--- defer与错误处理 ---")

	file, err := os.Create("temp.txt")
	if err != nil {
		fmt.Printf("创建文件失败: %v\n", err)
		return
	}

	// 确保文件被关闭，无论函数是否正常返回
	defer func() {
		file.Close()
		fmt.Println("文件已关闭")
	}()

	// 写入数据
	data := []byte("这是测试数据")
	n, err := file.Write(data)
	if err != nil {
		fmt.Printf("写入文件失败: %v\n", err)
		return // 即使提前返回，defer也会执行
	}

	fmt.Printf("成功写入%d字节到文件\n", n)
}

// DemoDeferInLoop 演示在循环中使用defer
func DemoDeferInLoop() {
	fmt.Println("\n--- 循环中的defer ---")

	// 注意: 在循环中使用defer可能会导致资源延迟释放
	// 正确的做法是在循环内部使用匿名函数
	for i := 0; i < 3; i++ {
		// 使用匿名函数确保defer在每次迭代结束时执行
		func(index int) {
			file, err := os.Create(fmt.Sprintf("temp_%d.txt", index))
			if err != nil {
				fmt.Printf("创建文件失败: %v\n", err)
				return
			}
			defer func() {
				file.Close()
				fmt.Printf("文件temp_%d.txt已关闭\n", index)
			}()

			data := []byte(fmt.Sprintf("这是文件%d的测试数据", index))
			file.Write(data)
		}(i)
	}
}

// DemoDeferFeatures 整合演示所有defer高级特性
func DemoDeferFeatures() {
	DemoDeferOrder()
	DemoDeferWithAnonymousFunction()
	DemoDeferWithErrorHandling()
	DemoDeferInLoop()
}
